todos:
還在出去玩,之後補上演算法 pesudocode + comments
8.2 提到的 Google spanner 也是
two-phase locking、serializability 等等原來是在前半部 concurrent 的範圍,但之後考慮在文章內做補充
現代有很多協作工具,例如 hackmd、Google docs,
或是不同裝置之間日曆的同步,
使用這些 app 時都可能會有短暫斷線,而後才連上,
如果這時候發生了不同 replica(裝置)上的存檔有衝突,該怎麼解決呢?
其實這種多人協作的應用程式,也可以採用第 7 章提到的 linearizable read/writes 方法,但除了很慢(讀寫都要與 quorum 個節點交流往返)還不能斷線。
為了讓使用者體驗,大部分協作軟體會採用 strong eventual consistency,等到裝置連線上了,再想辦法解決衝突。
CRDT 主要有兩種:
broadcast (set, t1, “title”, “Lecture 1”)
{演算法place holder}
{演算法place holder}
Operation-based: 通常廣播訊息比較小。
State-based: 可以接受訊息遺失、
![[Screen Shot 2021-09-25 at 8.08.46 PM.png]]
userA:在 0 插入 A,而後收到 userB 在 2 插入 D 的訊息,但因為對方插入位子的計算是基於還沒 insert(0,A) 的狀態,所以直接在現在的 2 插入 D 就會出錯。
![[Screen Shot 2021-09-25 at 7.39.00 PM.png]]
把剛收到的其他節點的更新,
以目前節點最新的狀態做一些 transformation 計算(需要透過 timestamp),
而得到能夠用在現在狀態的更新。
篇幅關係,這堂課並沒有對 OT 的計算深入介紹。
這裡介紹了另一種解決上述協作問題的方法。
如果以 index 來作為插入的標的,那只要本地的狀態被更新,從其他節點送來的更新勢必要透過 OT 轉換過才能 apply。
而如果改成頭尾0到1之間,插入時,是把要插入的兩邊的節點的位置取中間值,不同節點之間的更新都是依據相對的位子,就不用擔心之前插入時 index 已經跑掉的問題。
但要小心小數點的精度。
![[Screen Shot 2021-09-25 at 7.59.45 PM.png]]
{演算法place holder}